﻿package net.wangit;

import net.wangit.context.LocalContext;
import net.wangit.framework.expression.ConstantExpression;
import net.wangit.util.Checker;
import net.wangit.util.FileUtil;
import net.wangit.util.StringUtil;
import net.wangit.util.XMLUtil;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;


/**
 * 路径工具类，可用来获取应用根路径、home路径等
 * 
 * @author watson Feb 24, 2010
 */
public class Path {

	private static final Log log = LogFactory.getLog(net.wangit.Path.class);
	private static String root = null;
	private static String home = null;
	private static final String SKINS_PATH = "/common/skins/";
	private static final String DOMAIN = "/domain/";
	private static final String DATABASE = "database/";
	private static final String DATASOURCE = "/datasource/";
	private static final String I18N = "/i18n/";
	private static final String TEMPLATE = "/template/";
	private static final String VERSION = "/version/";
	private static final String CONFIG = "/config/";

	// 设置home路径（系统调用）。
	public static void setHomePath() {
		Document doc = XMLUtil.parseByFileName("init.xml");
		home = ConstantExpression.resolve(doc.getRootElement().getTextTrim());
		if (!Checker.isEmpty(home)
				&& (home.endsWith("\\") || home.endsWith("/")))
			home = home.substring(0, home.length() - 1);
		log.info(new StringBuilder("set home : ").append(home).toString());
	}

	// 取得根路径（绝对路径）。
	public static String getRootPath() {
		return root;
	}

	// 设置根路径（系统调用）。
	public static void setRootPath(String rootPath) {
		root = FileUtil.formatPath(rootPath);
		if (!Checker.isEmpty(root) && root.endsWith("/"))
			root = root.substring(0, root.length() - 1);
		root = StringUtil.replace(root, "/./", "/");
		log.info(new StringBuilder("set root : ").append(root).toString());
	}

	// 取得home路径（绝对路径）。
	public static String getHomePath() {
		return home;
	}

	// 取得数据源路径（绝对路径）。
	public static String getDatasourcePath() {
		return new StringBuilder(getHomePath()).append(Path.DATASOURCE)
				.toString();
	}

	// 取得域的根路径（绝对路径）。
	public static String getDomainRootPath() {
		return new StringBuilder(getHomePath()).append(Path.DOMAIN).toString();
	}

	// 取得指定域的路径（绝对路径）。
	public static String getDomainPath(String domain) {
		return new StringBuilder(getDomainRootPath()).append(domain)
				.append("/").toString();
	}

	// 取得指定域的数据库路径（绝对路径）。
	public static String getDomainDatabasePath(String domain) {
		return new StringBuilder(getDomainPath(domain)).append(Path.DATABASE)
				.toString();
	}

	// 取得皮肤即样式文件路径（相对路径）。
	public static String getSkin(String domain) {
		Visitor visitor = LocalContext.getLocalContext().getActionContext()
				.getVisitor();
		return new StringBuilder(Path.SKINS_PATH)
				.append(visitor.getSkin(domain)).append("/style.css")
				.toString();
	}

	// 取得模板路径（绝对路径）。
	public static String getTemplatePath() {
		return new StringBuilder(getHomePath()).append(Path.TEMPLATE)
				.toString();
	}

	// 取得I18N资源文件路径（绝对路径）。
	public static String getI18nPath() {
		return new StringBuilder(getHomePath()).append(Path.I18N).toString();
	}

	// 取得版本文件路径（绝对路径）。
	public static String getVersionPath() {
		return new StringBuilder(getHomePath()).append(Path.VERSION).toString();
	}

	// 取得系统配置路径（绝对路径）。
	public static String getConfigPath(String fileName) {
		return new StringBuilder(getHomePath()).append(Path.CONFIG)
				.append(fileName).toString();
	}

	private Path() {
	}
}
